<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
  
  <title>Spring MVC | conor_hua</title>
  <meta name="description" content="辉夜大小姐想让我写博客。" />
  <meta name="keywords" content="Java,Sakura,spring" />
  
    <link rel="shortcut icon" href="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/favicon00.ico">
  
  <meta http-equiv="x-dns-prefetch-control" content="on">
  <!--自定义看板娘-->
  <script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script>
  <script src="/live2d-widget/autoload.js"></script>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome/css/font-awesome.min.css"/>

  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.6/css/googlefont.css" media="all">
<!--  <link rel="dns-prefetch" href="//cdn.jsdelivr.net">-->
  <link rel="stylesheet" id="saukra_css-css" href="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.6/css/style.css" type="text/css" media="all">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.6/css/lib.min.css" media="all">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.6/css/font.css" media="all">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.6/css/insight.css" media="all">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.6/css/jquery.fancybox.min.css" media="all">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.6/css/zoom.css" media="all">
  <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.6/css/sharejs.css">
  <link rel="stylesheet" href="/css/tags.css" media="all">
  <!--   <link rel="stylesheet" id="saukra_css-css" href="https://2heng.xin/wp-content/cache/autoptimize/css/autoptimize_ad42a61f4c7d4bdd9f91afcff6b5dda5.css
" type="text/css" media="all"> -->
  <script>
  /*Initial Variables*/
  var mashiro_option = new Object();
  var mashiro_global = new Object();
  mashiro_option.NProgressON = true;
  /* 
   * 邮箱信息之类的东西可以填在这里，这些js变量基本都作用于sakura-app.js
   * 这样的设置仅是为了方便在基于PHP开发的主题中设置js变量，既然移植到了Node上，我想或许可以精简这一逻辑吧
   */
  mashiro_option.email_domain = "";
  mashiro_option.email_name = "";
  mashiro_option.cookie_version_control = "";
  mashiro_option.qzone_autocomplete = false;
  mashiro_option.site_name = "Conor_hua";
  mashiro_option.author_name = "";
  mashiro_option.site_url = "https://conor_hua.gitee.io";
  mashiro_option.v_appId = "GyC3NzMvd0hT9Yyd2hYIC0MN-gzGzoHsz";
  mashiro_option.v_appKey = "mgOpfzbkHYqU92CV4IDlAUHQ";
  mashiro_option.mathjax = "0";
  mashiro_option.qq_api_url = "https://api.mashiro.top/qqinfo/"; 
  mashiro_option.qq_avatar_api_url = "https://api.mashiro.top/qqinfo/";

  // mashiro_option.jsdelivr_css_src = "https://cdn.jsdelivr.net/gh/moezx/cdn@3.4.5/css/lib.min.css";
  // mashiro_option.float_player_on = true;

  /*End of Initial Variables*/
  </script>
  <script type="text/javascript">
  var bg = "https://cdn.jsdelivr.net/gh/conorhua/asset/ima/banner/6f005cbc1865ff1b706aba57347988ab.webp,https://cdn.jsdelivr.net/gh/conorhua/asset/ima/banner/ox83gp.jpg,https://cdn.jsdelivr.net/gh/conorhua/asset/ima/banner/a5fa4f9db760f58fc48f03d66b4967f7.webp,https://cdn.jsdelivr.net/gh/conorhua/asset/ima/banner/zm3vey.jpg,https://cdn.jsdelivr.net/gh/conorhua/asset/ima/banner/b3e8dae89b950b940dc0edd1e8cc0566.webp,https://cdn.jsdelivr.net/gh/conorhua/asset/ima/banner/j58y6y.jpg,https://cdn.jsdelivr.net/gh/conorhua/asset/ima/banner/4217z9.jpg,https://cdn.jsdelivr.net/gh/conorhua/asset/ima/banner/j5zg2p.jpg".split(",");
  var bgindex = Math.floor(Math.random()*bg.length);
  if (!!window.ActiveXObject || "ActiveXObject" in window) { //is IE?
    alert('朋友，IE浏览器未适配哦~');
  }
  </script>
  <style type="text/css">
  .hljs-ln{border-collapse:collapse}.hljs-ln td{padding:0}.hljs-ln-n:before{content:attr(data-line-number)}
  </style>
  <style type="text/css">.site-top .lower nav{display:block !important;}.author-profile i,.post-like a,.post-share .show-share,.sub-text,.we-info a,span.sitename,.post-more i:hover,#pagination a:hover,.post-content a:hover,.float-content i:hover{color:#FE9600}.feature i,.download,.navigator i:hover,.links ul li:before,.ar-time i,span.ar-circle,.object,.comment .comment-reply-link,.siren-checkbox-radio:checked + .siren-checkbox-radioInput:after{background:#FE9600}::-webkit-scrollbar-thumb{background:#FE9600}.download,.navigator i:hover,.link-title,.links ul li:hover,#pagination a:hover,.comment-respond input[type='submit']:hover{border-color:#FE9600}.entry-content a:hover,.site-info a:hover,.comment h4 a,#comments-navi a.prev,#comments-navi a.next,.comment h4 a:hover,.site-top ul li a:hover,.entry-title a:hover,#archives-temp h3,span.page-numbers.current,.sorry li a:hover,.site-title a:hover,i.iconfont.js-toggle-search.iconsearch:hover,.comment-respond input[type='submit']:hover{color:#FE9600}.comments .comments-main{display:block !important;}.comments .comments-hidden{display:none !important;}background-position:center center;background-attachment:inherit;}
  </style>
<script src="https://cdn.jsdelivr.net/gh/conorhua/asset/js/hititle.js"></script>
<meta name="generator" content="Hexo 4.2.1"></head>

<body class="page-template page-template-user page-template-page-analytics page-template-userpage-analytics-php page page-id-1297 chinese-font serif isWebKit">
  <div class="scrollbar" id="bar">
  </div>
  <a href="#" class="cd-top faa-float animated"></a>
  <section id="main-container">
    <div class="headertop filter-dot">
  <div id="banner_wave_1"></div>
  <div id="banner_wave_2"></div>
  <figure id="centerbg" class="centerbg">
    <div class="focusinfo no-select">
      <div class="header-tou">
        <a href="https://conor_hua.gitee.io" target="_blank" rel="noopener">
          <img src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/xiaomai.jpg">
        </a>
      </div>
      <div class="header-info">
        <p id="jinrishici-sentence">正在加载今日诗词....</p>
        <script src="https://sdk.jinrishici.com/v2/browser/jinrishici.js" charset="utf-8"></script>
        <div class="top-social_v2">
          <li id="bg-pre">
            <img class="flipx" src="https://cdn.jsdelivr.net/gh/honjun/cdn@1.6/img/other/next-b.svg">
          </li>
          
          
          
          <li>
            <a href="http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&amp;email=1_bi5eLm4_Tj4uGXpqb5tLi6" target="_blank" class="social-github" title="email">
              <img src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/email.png">
            </a>
          </li>
          
          
          
          <li class="wechat">
            <a href="/#">
              <img src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/wechat.png">
            </a>
            <div class="wechatInner">
              <img src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/1.jpg">
            </div>
          </li>
          
          
          
          <li id="bg-next">
            <img src="https://cdn.jsdelivr.net/gh/honjun/cdn@1.6/img/other/next-b.svg">
          </li>
        </div>
      </div>
    </div>
  </figure>
  
  <div id="video-container" style="display: none;">
    <video style="object-fit: fill" id="bgvideo" class="video" video-name="" src="" width="auto" preload="auto">
    </video>
    <div id="video-btn" class="loadvideo videolive">
    </div>
    <div id="video-add">
    </div>
    <div class="video-stu">
    </div>
  </div>
  
  <div class="headertop-down faa-float animated" onclick="headertop_down()">
    <span>
      <i class="fa fa-chevron-down" aria-hidden="true">
      </i>
    </span>
  </div>
</div>
    <div id="page" class="site wrapper">
      <header class="site-header no-select gizle sabit" role="banner">
 
  <div class="site-top">
    <div class="site-branding">
      <span class="site-title">
        <span class="logolink moe-mashiro">
          <a href="/">
            <span class="sakurasono">Conor_hua</span>
            <span class="shironeko"></span>
          </a>
        </span>
      </span>
    </div>
    <div class="searchbox search-form-submit">
      <i class="iconfont js-toggle-search iconsearch icon-search">
      </i>
    </div>
    <div id="show-nav" class="showNav mobile-fit">
      <div class="line line1">
      </div>
      <div class="line line2">
      </div>
      <div class="line line3">
      </div>
    </div>
    <div class="lower-cantiner">
      <div class="lower">
        <nav class="mobile-fit-control hide">
          <ul id="menu-new" class="menu">
            
              <li>
                <a href="/">
                  <span class="faa-parent animated-hover">
                    <i class="fa  fa-fort-awesome faa-shake" aria-hidden="true"></i>
                    首页
                  </span>
                </a>
                
              </li>
            
              <li>
                <a href="/archives">
                  <span class="faa-parent animated-hover">
                    <i class="fa  fa-archive faa-shake" aria-hidden="true"></i>
                    归档
                  </span>
                </a>
                
                  <ul class="sub-menu">
                    
                      <li>
                        <a href="/categories/%E6%8A%80%E6%9C%AF/">
                          <i class="fa fa-code" aria-hidden="true"></i>
                          技术
                        </a>
                      </li>
                    
                      <li>
                        <a href="/categories/%E5%B9%B2%E8%B4%A7/">
                          <i class="fa fa-plug" aria-hidden="true"></i>
                          干货
                        </a>
                      </li>
                    
                  </ul>
                
              </li>
            
              <li>
                <a href="javascript:;">
                  <span class="faa-parent animated-hover">
                    <i class="fa  fa-list-ul faa-vertical" aria-hidden="true"></i>
                    清单
                  </span>
                </a>
                
                  <ul class="sub-menu">
                    
                      <li>
                        <a href="/bangumis/">
                          <i class="fa fa-film faa-vertical" aria-hidden="true"></i>
                          番剧
                        </a>
                      </li>
                    
                      <li>
                        <a href="/categories/%E6%94%B6%E8%97%8F/">
                          <i class="fa fa-star" aria-hidden="true"></i>
                          收藏
                        </a>
                      </li>
                    
                  </ul>
                
              </li>
            
              <li>
                <a href="/tags/">
                  <span class="faa-parent animated-hover">
                    <i class="fa  fa-tags" aria-hidden="true"></i>
                    标签
                  </span>
                </a>
                
              </li>
            
              <li>
                <a href="javascript:;">
                  <span class="faa-parent animated-hover">
                    <i class="fa  fa-leaf faa-wrench" aria-hidden="true"></i>
                    关于
                  </span>
                </a>
                
                  <ul class="sub-menu">
                    
                      <li>
                        <a href="/about/">
                          <i class="fa fa-meetup" aria-hidden="true"></i>
                          我？
                        </a>
                      </li>
                    
                      <li>
                        <a href="/theme-sakura/">
                          <i class="fa iconfont icon-sakura" aria-hidden="true"></i>
                          主题
                        </a>
                      </li>
                    
                  </ul>
                
              </li>
            
              <li>
                <a href="/links/">
                  <span class="faa-parent animated-hover">
                    <i class="fa  fa-link faa-shake" aria-hidden="true"></i>
                    友人帐
                  </span>
                </a>
                
              </li>
            
          </ul>
        </nav>
      </div>
    </div>
  </div>
</header>

      <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.6/css/sharejs.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.6/css/tocbot.css">
<div class="pattern-center-blank"></div>

  <div class="pattern-center single-center">
    <!-- 有配图默认渲染第一张 -->
    <div class="pattern-attachment-img">
        <img src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/upload.gif" data-src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/banner/wallhaven-2839em.jpg" class="lazyload" onerror="imgError(this,3)" style="width: 100%; height: 100%; object-fit: cover; pointer-events: none;">
      </div>
    <header class="pattern-header single-header">
      <h1 class="entry-title">
      Spring MVC</h1>
      <p class="entry-census">
        <span>
          <a href="">
            <img src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/xiaomai.jpg">
          </a>
        </span>
        <span>
          <a href="">Conor_hua</a>
        </span>
        <span class="bull">
        ·</span>
        2021-8-15
        
      
        ·<span id="readcount"></span>次阅读
      
      </p>
    </header>
  </div>

<div id="content" class="site-content">
  <div id="primary" class="content-area">
    <main id="main" class="site-main" role="main">
      <article id="post-1" class="post-1 post type-post status-publish format-standard has-post-thumbnail hentry category-uncategorized">
        <div class="toc"></div>
        <!--<div class="toc-entry-content"> <!-- 套嵌目录使用（主要为了支援评论）-->
        
        <div class="entry-content">
          <h1 id="SpringMVC框架"><a href="#SpringMVC框架" class="headerlink" title="SpringMVC框架"></a>SpringMVC框架</h1><h2 id="SpringMVC的概念"><a href="#SpringMVC的概念" class="headerlink" title="SpringMVC的概念"></a>SpringMVC的概念</h2><pre><code>三层架构 

我们的开发架构一般都是基于两种形式，一种是C/S架构，也就是客户端/服务器，另一种是B/S架构，也就
是浏览器服务器。在JavaEE开发中，几乎全都是基于B/S架构的开发。那么在B/S架构中，系统标准的三层架构
包括：表现层、业务层、持久层。三层架构在我们的实际开发中使用的非常多，所以我们课程中的案例也都是基于
三层架构设计的。 
三层架构中，每一层各司其职，接下来我们就说说每层都负责哪些方面： 
表现层： 
 也就是我们常说的web层。它负责接收客户端请求，向客户端响应结果，通常客户端使用http协议请求
web层，web需要接收 http请求，完成 http响应。 
 表现层包括展示层和控制层：控制层负责接收请求，展示层负责结果的展示。 
 表现层依赖业务层，接收到客户端请求一般会调用业务层进行业务处理，并将处理结果响应给客户端。 
 表现层的设计一般都使用 MVC模型。（MVC是表现层的设计模型，和其他层没有关系） 
业务层： 
 也就是我们常说的 service层。它负责业务逻辑处理，和我们开发项目的需求息息相关。web层依赖业
务层，但是业务层不依赖 web层。 
 业务层在业务处理时可能会依赖持久层，如果要对数据持久化需要保证事务一致性。（也就是我们说的，
事务应该放到业务层来控制） 
持久层： 
 也就是我们是常说的 dao 层。负责数据持久化，包括数据层即数据库和数据访问层，数据库是对数据进
行持久化的载体，数据访问层是业务层和持久层交互的接口，业务层需要通过数据访问层将数据持久化到数据库
中。通俗的讲，持久层就是和数据库交互，对数据库表进行曾删改查的。</code></pre><pre><code>MVC 模型 

MVC 全名是 Model View Controller，是模型(model)－视图(view)－控制器(controller)的缩写，
是一种用于设计创建 Web 应用程序表现层的模式。MVC中每个部分各司其职： 
 Model（模型）： 
 通常指的就是我们的数据模型。作用一般情况下用于封装数据。 
 View（视图）： 
 通常指的就是我们的 jsp或者 html。作用一般就是展示数据的。 
 通常视图是依据模型数据创建的。 


 Controller（控制器）： 
 是应用程序中处理用户交互的部分。作用一般就是处理程序逻辑的。 
 它相对于前两个不是很好理解，这里举个例子： 
 例如： 
 我们要保存一个用户的信息，该用户信息中包含了姓名，性别，年龄等等。 
 这时候表单输入要求年龄必须是 1~100 之间的整数。姓名和性别不能为空。并且把数据填充
到模型之中。 
 此时除了 js 的校验之外，服务器端也应该有数据准确性的校验，那么校验就是控制器的该做
的。 
 当校验失败后，由控制器负责把错误页面展示给使用者。 
 如果校验成功，也是控制器负责把数据填充到模型，并且调用业务层实现完整的业务需求。</code></pre><h2 id="SpringMVC是什么"><a href="#SpringMVC是什么" class="headerlink" title="SpringMVC是什么"></a>SpringMVC是什么</h2><pre><code>SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架，属于 Spring 
FrameWork 的后续产品，已经融合在 Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功
能 MVC 模块。使用 Spring 可插入的 MVC 架构，从而在使用Spring进行WEB开发时，可以选择使用 Spring 
的 Spring MVC 框架或集成其他 MVC开发框架，如 Struts1(现在一般不用)，Struts2等。 
SpringMVC已经成为目前最主流的 MVC 框架之一，并且随着 Spring3.0的发布，全面超越 Struts2，成
为最优秀的 MVC 框架。 
它通过一套注解，让一个简单的 Java 类成为处理请求的控制器，而无须实现任何接口。同时它还支持
RESTful编程风格的请求。</code></pre><h2 id="SpringMVC-的优势"><a href="#SpringMVC-的优势" class="headerlink" title="SpringMVC 的优势"></a>SpringMVC 的优势</h2><pre><code>

1、清晰的角色划分： 
 前端控制器（DispatcherServlet） 
 请求到处理器映射（HandlerMapping） 
 处理器适配器（HandlerAdapter） 
 视图解析器（ViewResolver） 
 处理器或页面控制器（Controller） 
 验证器（ Validator） 
 命令对象（Command 请求参数绑定到的对象就叫命令对象） 
 表单对象（Form Object 提供给表单展示和提交到的对象就叫表单对象）。 
2、分工明确，而且扩展点相当灵活，可以很容易扩展，虽然几乎不需要。 
3、由于命令对象就是一个 POJO，无需继承框架特定 API，可以使用命令对象直接作为业务对象。 
4、和 Spring 其他框架无缝集成，是其它 Web框架所不具备的。 
5、可适配，通过 HandlerAdapter可以支持任意的类作为处理器。 
6、可定制性，HandlerMapping、ViewResolver等能够非常简单的定制。 
7、功能强大的数据验证、格式化、绑定机制。 
8、利用 Spring提供的 Mock对象能够非常简单的进行 Web层单元测试。 
9、本地化、主题的解析的支持，使我们更容易进行国际化和主题的切换。 
10、强大的 JSP标签库，使 JSP编写更容易。 
………………还有比如RESTful风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配
置支持等等。 </code></pre><p> SpringMVC 和 Struts2 的优略分析 </p>
<pre><code>

共同点： 
 它们都是表现层框架，都是基于 MVC模型编写的。 
 它们的底层都离不开原始 ServletAPI。 
 它们处理请求的机制都是一个核心控制器。 
区别： 
 Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter 
 Spring MVC 是基于方法设计的，而 Struts2是基于类，Struts2每次执行都会创建一个动作类。所
以 Spring MVC 会稍微比 Struts2 快些。 
 Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 ajax 的请求更方便 
 (JSR303 是一套 JavaBean 参数校验的标准，它定义了很多常用的校验注解，我们可以直接将这些注
解加在我们 JavaBean的属性上面，就可以在需要校验的时候进行校验了。) 
 Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些，但执行效率并没有比 JSTL 提
升，尤其是 struts2的表单标签，远没有 html执行效率高。 </code></pre><h2 id="原理的简单理解"><a href="#原理的简单理解" class="headerlink" title="原理的简单理解"></a>原理的简单理解</h2><p><img src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/blog/spring/mvc.png" alt="pointCut"></p>
<ul>
<li>客户端（浏览器）发送请求，请求交由DispatcherServlet处理。</li>
<li>DispatcherServlet根据请求url调用HandlerMapping，解析请求对应的Handler。</li>
<li>解析到对应的Handler后，开始由HandlerAdapter适配器处理。</li>
<li>HandlerAdapter会根据Handler来调用真正的Controller开处理请求，并处理相应的业务逻辑。</li>
<li>处理器处理完业务后，会返回一个ModelAndView对象，Model是返回的数据对象，View是个逻辑上的View</li>
<li>ViewResolver会根据逻辑View查找实际的View。</li>
<li>DispaterServlet把返回的Model传给View。</li>
<li>通过View返回给请求者（浏览器）</li>
</ul>
<h2 id="建立springMVC"><a href="#建立springMVC" class="headerlink" title="建立springMVC"></a>建立springMVC</h2><pre><code>1. 需求:  index.jsp -&gt;超链接到success页面

2.  创建webapp骨架项目
3. 解决maven加载文件过慢: archetypeCatalog=internal
4. 添加文件夹java resources
5. 导入依赖
   &lt;!-- 版本锁定 --&gt;
    &lt;properties&gt;
        &lt;spring.version&gt;5.0.2.RELEASE&lt;/spring.version&gt;
    &lt;/properties&gt;
         &lt;dependencies&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-context&lt;/artifactId&gt;
            &lt;version&gt;${spring.version}&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-web&lt;/artifactId&gt;
            &lt;version&gt;${spring.version}&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-webmvc&lt;/artifactId&gt;
            &lt;version&gt;${spring.version}&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
            &lt;artifactId&gt;servlet-api&lt;/artifactId&gt;
            &lt;version&gt;2.5&lt;/version&gt;
            &lt;scope&gt;provided&lt;/scope&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;javax.servlet.jsp&lt;/groupId&gt;
            &lt;artifactId&gt;jsp-api&lt;/artifactId&gt;
            &lt;version&gt;2.0&lt;/version&gt;
            &lt;scope&gt;provided&lt;/scope&gt;
        &lt;/dependency&gt;
    &lt;/dependencies&gt;
 6.tomcat部署</code></pre><h3 id="配置springMVC-核心容器-DispatcherServlet"><a href="#配置springMVC-核心容器-DispatcherServlet" class="headerlink" title="配置springMVC 核心容器 DispatcherServlet"></a>配置springMVC 核心容器 DispatcherServlet</h3><pre><code>

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; 
&lt;web-app xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; 
 xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot; 
 xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot; 
 id=&quot;WebApp_ID&quot; version=&quot;2.5&quot;&gt; 
 &lt;!-- 配置 spring mvc的核心控制器 --&gt; 
 &lt;servlet&gt; 
     &lt;servlet-name&gt;SpringMVCDispatcherServlet&lt;/servlet-name&gt; 
     &lt;servlet-class&gt; 
     org.springframework.web.servlet.DispatcherServlet 
     &lt;/servlet-class&gt; 
     &lt;!-- 配置初始化参数，用于读取 SpringMVC的配置文件 --&gt; 
     &lt;init-param&gt; 
         &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; 
         &lt;param-value&gt;classpath:SpringMVC.xml&lt;/param-value&gt; 
     &lt;/init-param&gt; 
 &lt;!-- 配置 servlet的对象的创建时间点：应用加载时创建。 
 取值只能是非 0正整数，表示启动顺序 --&gt; 
 &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; 
 &lt;/servlet&gt; 
 &lt;servlet-mapping&gt; 
     &lt;servlet-name&gt;SpringMVCDispatcherServlet&lt;/servlet-name&gt; 
     &lt;url-pattern&gt;/&lt;/url-pattern&gt; 
 &lt;/servlet-mapping&gt; 

&lt;/web-app&gt; </code></pre><h3 id="spring-mvc-的配置文件"><a href="#spring-mvc-的配置文件" class="headerlink" title="spring mvc 的配置文件"></a>spring mvc 的配置文件</h3><pre><code>

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; 
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot; 
 xmlns:mvc=&quot;http://www.springframework.org/schema/mvc&quot; 
 xmlns:context=&quot;http://www.springframework.org/schema/context&quot; 
 xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; 
 xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans.xsd 
 http://www.springframework.org/schema/mvc 
 http://www.springframework.org/schema/mvc/spring-mvc.xsd 
 http://www.springframework.org/schema/context 
 http://www.springframework.org/schema/context/spring-context.xsd&quot;&gt; 
 &lt;!-- 配置创建 spring容器要扫描的包 --&gt; 
    &lt;context:component-scan base-package=&quot;org.zqxy&quot;&gt;&lt;/context:component-scan&gt; 

    &lt;!-- 配置视图解析器 --&gt; 
 &lt;bean 
class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt; 
 &lt;property name=&quot;prefix&quot; value=&quot;/WEB-INF/pages/&quot;&gt;&lt;/property&gt; 
 &lt;property name=&quot;suffix&quot; value=&quot;.jsp&quot;&gt;&lt;/property&gt; 
     &lt;/bean&gt; 
        &lt;!-- springMVC注解的支持 --&gt;
        &lt;mvc:annotation-driven/&gt;
&lt;/beans&gt; </code></pre><h3 id="建立视图"><a href="#建立视图" class="headerlink" title="建立视图"></a>建立视图</h3><pre><code>&lt;%@ page contentType=&quot;text/html; charset=UTF-8&quot; language=&quot;java&quot; %&gt;

&lt;a href=&quot;&quot; &gt;&lt;/a&gt;</code></pre><h3 id="编写控制器并使用注解配置"><a href="#编写控制器并使用注解配置" class="headerlink" title="编写控制器并使用注解配置"></a>编写控制器并使用注解配置</h3><pre><code>

/** 
 * spring mvc的入门案例 
 */ 
@Controller(&quot;helloController&quot;) 
public class HelloController { 

 @RequestMapping(path=&quot;/hello&quot;) 
 public String sayHello() { 
 System.out.println(&quot;HelloController的 sayHello 方法执行了。。。。&quot;); 
 return &quot;success&quot;; 
 } 
} </code></pre><p>@RequestMapping注解的作用 </p>
<pre><code> RequestMapping注解 
1. RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
2. RequestMapping注解可以作用在方法和类上
1. 作用在类上：第一级的访问目录
2. 作用在方法上：第二级的访问目录
3. 细节：路径可以不编写 / 表示应用的根目录开始
3. RequestMapping的属性
1. path 指定请求路径的url
2. value       value属性和path属性是一样的
3. mthod     指定该方法的请求方式
4. params   {&quot;user=hehe&quot;}指定限制请求参数的条件
5. headers  {&quot;Accept&quot;}发送的请求中必须包含的请求头</code></pre><p>返回String 表示一个jsp页面</p>
<h3 id="配置视图解析器"><a href="#配置视图解析器" class="headerlink" title="配置视图解析器"></a>配置视图解析器</h3><pre><code>&lt;bean 
class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt; 
         &lt;property name=&quot;prefix&quot; value=&quot;/WEB-INF/pages/&quot;&gt;&lt;/property&gt; 
         &lt;property name=&quot;suffix&quot; value=&quot;.jsp&quot;&gt;&lt;/property&gt; 
     &lt;/bean&gt; </code></pre><p>请求参数绑定</p>
<pre><code>请求参数的绑定说明
1. 绑定机制
        1. 表单提交的数据都是k=v格式的 username=haha&amp;password=123
        2. SpringMVC的参数绑定过程是把表单提交的请求参数，作为控制器中方法的参数进行绑定的
        3. 要求：提交表单的name和参数的名称是相同的
2. 支持的数据类型
        1. 基本数据类型和字符串类型 
        2. 实体类型（JavaBean）
        3. 集合数据类型（List、map集合等） List&lt;User&gt;                list[0].name,
                                      Map&lt;String, User&gt;            map[&#39;name&#39;].name
2. 基本数据类型和字符串类型
        1. 提交表单的name和参数的名称是相同的
        2. 区分大小写
3. 实体类型（JavaBean）
        1. 提交表单的name和JavaBean中的属性名称需要一致
        2. 如果一个JavaBean类中包含其他的引用类型，那么表单的name属性需要编写成：对象.属性 例如：
        address.name
4. 给集合属性数据封装
        1. JSP页面编写方式：list[0].属性
5. 请求参数中文乱码的解决
        1. 在web.xml中配置Spring提供的过滤器类
6. 自定义类型转换器
        date 2021/01/01 封装成功
        1. 表单提交的任何数据类型全部都是字符串类型，但是后台定义Integer类型，数据也可以封装上，说明
        Spring框架内部会默认进行数据类型转换。
        2. 如果想自定义数据类型转换，可以实现Converter的接口
        1. 自定义类型转换器
        &lt;!-- 配置类型转换器工厂 --&gt; 
        &lt;bean id=&quot;converterService&quot;  
         class=&quot;org.springframework.context.support.ConversionServiceFactoryBean&quot;&gt; 
         &lt;!-- 给工厂注入一个新的类型转换器 --&gt; 
             &lt;property name=&quot;converters&quot;&gt; 
                     &lt;array&gt; 
                     &lt;!-- 配置自定义类型转换器 --&gt; 
                         &lt;bean class=&quot;com.itheima.web.converter.StringToDateConverter&quot;&gt;&lt;/bean&gt; 
                     &lt;/array&gt; 
             &lt;/property&gt; 
        &lt;/bean&gt; 
        第三步：在 annotation-driven标签中引用配置的类型转换服务 
        &lt;!-- 引用自定义类型转换器 --&gt; 
        &lt;mvc:annotation-driven conversion-service=&quot;converterService&quot;&gt;&lt;/mvc:annotation-driven&gt; 

  7. 配置过滤器，解决中文乱码的问题
   &lt;!-- 配置过滤器，解决中文乱码的问题 --&gt;
    &lt;filter&gt;
        &lt;filter-name&gt;characterEncodingFilter&lt;/filter-name&gt;
        &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-
class&gt;
        &lt;!-- 指定字符集 --&gt;
        &lt;init-param&gt;
            &lt;param-name&gt;encoding&lt;/param-name&gt;
            &lt;param-value&gt;UTF-8&lt;/param-value&gt;
        &lt;/init-param&gt;
    &lt;/filter&gt;
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;characterEncodingFilter&lt;/filter-name&gt;
        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;

8. 在控制器中使用原生的ServletAPI对象
        1. 只需要在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象</code></pre><h2 id="Restful-风格"><a href="#Restful-风格" class="headerlink" title="Restful 风格"></a>Restful 风格</h2><pre><code>REST 风格 URL 

1.什么是 rest： 
     REST（英文：Representational State Transfer，简称 REST）描述了一个架构样式的网络系统，
    比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中，他是 HTTP 规范的主要编写者之
    一。在目前主流的三种 Web 服务交互方案中，REST 相比于 SOAP（Simple Object Access protocol，简单
    对象访问协议）以及 XML-RPC更加简单明了，无论是对 URL的处理还是对 Payload的编码，REST都倾向于用更
    加简单轻量的方法设计和实现。值得注意的是 REST并没有一个明确的标准，而更像是一种设计的风格。 
     它本身并没有什么实用性，其核心价值在于如何设计出符合 REST风格的网络接口。 
2. restful的优点 
     它结构清晰、符合标准、易于理解、扩展方便，所以正得到越来越多网站的采用。 
    restful的特性： 
    资源（Resources）：网络上的一个实体，或者说是网络上的一个具体信息。 
     它可以是一段文本、一张图片、一首歌曲、一种服务，总之就是一个具体的存在。可以用一个 URI（统一
    资源定位符）指向它，每种资源对应一个特定的 URI 。要 
    获取这个资源，访问它的 URI就可以，因此 URI 即为每一个资源的独一无二的识别符。 
    表现层（Representation）：把资源具体呈现出来的形式，叫做它的表现层 （Representation）。 
     比如，文本可以用 txt 格式表现，也可以用 HTML 格式、XML 格式、JSON 格式表现，甚至可以采用二
    进制格式。 
    状态转化（State Transfer）：每 发出一个请求，就代表了客户端和服务器的一次交互过程。 
     HTTP 协议，是一个无状态协议，即所有的状态都保存在服务器端。因此，如果客户端想要操作服务器，
    必须通过某种手段，让服务器端发生“状态转化”（State Transfer）。而这种转化是建立在表现层之上的，所以
    就是 “表现层状态转化”。具体说，就是 HTTP 协议里面，四个表示操作方式的动词：GET、POST、PUT、
    DELETE。它们分别对应四种基本操作：GET 用来获取资源，POST 用来新建资源，PUT 用来更新资源，DELETE 用来
    删除资源。 
3. restful的示例： 
     /account/1 HTTP GET ： 得到 id = 1 的 account 
     /account/1 HTTP DELETE： 删除 id = 1 的 account 
     /account/1 HTTP PUT： 更新 id = 1 的 account 
     /account HTTP POST： 新增 account </code></pre><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><h3 id="返回值类型"><a href="#返回值类型" class="headerlink" title="返回值类型"></a>返回值类型</h3><pre><code>字符串 

        controller方法返回字符串可以指定逻辑视图名，通过视图解析器解析为物理视图地址。 
        //指定逻辑视图名，经过视图解析器解析为 jsp物理路径：/WEB-INF/pages/success.jsp 
        @RequestMapping(&quot;/testReturnString&quot;) 
        public String testReturnString() { 
         System.out.println(&quot;AccountController的 testReturnString 方法执行了。。。。&quot;); 
         return &quot;success&quot;; 
        } 
void 

        在昨天的学习中，我们知道 Servlet原始 API可以作为控制器中方法的参数： 
        @RequestMapping(&quot;/testReturnVoid&quot;) 
        public void testReturnVoid(HttpServletRequest request,HttpServletResponse response) 
        throws Exception {  
        } 
        在controller方法形参上可以定义request和response，使用request或response指定响应结果： 
        1、使用 request转向页面，如下： 

                request.getRequestDispatcher(&quot;/WEB-INF/pages/success.jsp&quot;).forward(request, 
                response); 

        2、也可以通过 response页面重定向： 
                response.sendRedirect(&quot;testRetrunString&quot;) 

        3、也可以通过 response指定响应结果，例如响应 json数据： 
                response.setCharacterEncoding(&quot;utf-8&quot;); 
                response.setContentType(&quot;application/json;charset=utf-8&quot;); 
                response.getWriter().write(&quot;json 串&quot;); 

ModelAndView 

        ModelAndView是 SpringMVC为我们提供的一个对象，该对象也可以用作控制器方法的返回值。 
        该对象中有两个方法： 


        示例代码： 
        /** 
         * 返回 ModeAndView 
         * @return 
         */ 
        @RequestMapping(&quot;/testReturnModelAndView&quot;) 
        public ModelAndView testReturnModelAndView() { 
         ModelAndView mv = new ModelAndView(); 
         mv.addObject(&quot;username&quot;, &quot;张三&quot;); 
         mv.setViewName(&quot;success&quot;); 
         return mv; 
        } 
        响应的 jsp代码： 
        &lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; 
        pageEncoding=&quot;UTF-8&quot;%&gt; 
        &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; 
        &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt; 
        &lt;html&gt; 
        &lt;head&gt; 
        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt; 
        &lt;title&gt;执行成功&lt;/title&gt; 
        &lt;/head&gt; 
        &lt;body&gt; 
        执行成功！ 

        ${requestScope.username} 
        &lt;/body&gt; 
        &lt;/html&gt; 

        注意： 
         我们在页面上上获取使用的是 requestScope.username取的，所以返回 ModelAndView类型时，浏
        览器跳转只能是请求转发。 </code></pre><h3 id="ResponseBody-响应-json-数据"><a href="#ResponseBody-响应-json-数据" class="headerlink" title="ResponseBody 响应 json 数据"></a>ResponseBody 响应 json 数据</h3><pre><code>

1.3.1 使用说明 

        作用： 
         该注解用于将Controller的方法返回的对象，通过HttpMessageConverter接口转换为指定格式的
        数据如：json,xml等，通过 Response响应给客户端 

        1.3.2 使用示例 

        需求： 
         使用@ResponseBody注解实现将 controller方法返回对象转换为 json响应给客户端。 
        前置知识点： 
         Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换，需要加入
        jackson的包。 

        注意：2.7.0以下的版本用不了 



  jsp中的代码： 
        &lt;script type=&quot;text/javascript&quot; 
        src=&quot;${pageContext.request.contextPath}/js/jquery.min.js&quot;&gt;&lt;/script&gt; 
        &lt;script type=&quot;text/javascript&quot;&gt; 
         $(function(){ 
         $(&quot;#testJson&quot;).click(function(){ 
         $.ajax({ 
         type:&quot;post&quot;, 
         url:&quot;${pageContext.request.contextPath}/testResponseJson&quot;, 
         contentType:&quot;application/json;charset=utf-8&quot;, 
         data:&#39;{&quot;id&quot;:1,&quot;name&quot;:&quot;test&quot;,&quot;money&quot;:999.0}&#39;, 
         dataType:&quot;json&quot;, 
         success:function(data){ 
         alert(data); 
         } 
         }); 
         }); 
         }) 
        &lt;/script&gt; 
        &lt;!-- 测试异步请求 --&gt; 
        &lt;input type=&quot;button&quot; value=&quot;测试 ajax请求 json和响应 json&quot; id=&quot;testJson&quot;/&gt; 
        控制器中的代码： 
        /** 
         * 响应 json数据的控制器 
         * @author 黑马程序员 
         * @Company http://www.ithiema.com 
         * @Version 1.0 
         */ 
        @Controller(&quot;jsonController&quot;) 
        public class JsonController { 

         /** 
         * 测试响应 json数据 
         */ 
         @RequestMapping(&quot;/testResponseJson&quot;) 
         public @ResponseBody Account testResponseJson(@RequestBody Account account) { 
         System.out.println(&quot;异步请求：&quot;+account); 
         return account; 
         } 
        } 
        运行结果： </code></pre><h3 id="转发与重定向"><a href="#转发与重定向" class="headerlink" title="转发与重定向"></a>转发与重定向</h3><pre><code>forward 转发 

            controller方法在提供了 String类型的返回值之后，默认就是请求转发。我们也可以写成： 
             /** 
             * 转发 
             * @return 
             */ 
             @RequestMapping(&quot;/testForward&quot;) 
             public String testForward() { 
             System.out.println(&quot;AccountController的 testForward 方法执行了。。。。&quot;); 
             return &quot;forward:/WEB-INF/pages/success.jsp&quot;; 
             } 
             需要注意的是，如果用了 formward：则路径必须写成实际视图 url，不能写逻辑视图。 
             它相当于“request.getRequestDispatcher(&quot;url&quot;).forward(request,response)”。使用请求
             转发，既可以转发到 jsp，也可以转发到其他的控制器方法。 

1.2.2 Redirect 重定向 

            contrller方法提供了一个 String类型返回值之后，它需要在返回值里使用:redirect: 
            /** 
            * 重定向 
            * @return 
            */ 
            @RequestMapping(&quot;/testRedirect&quot;) 
            public String testRedirect() { 
            System.out.println(&quot;AccountController的 testRedirect 方法执行了。。。。&quot;); 
            return &quot;redirect:testReturnModelAndView&quot;; 
            } 

            它相当于“response.sendRedirect(url)”。需要注意的是，如果是重定向到 jsp页面，则 jsp页面不
            能写在 WEB-INF目录中，否则无法找到。 </code></pre><p>设置静态资源不过滤</p>
<pre><code>
1. DispatcherServlet会拦截到所有的资源，导致一个问题就是静态资源（img、css、js）也会被拦截到，从而
不能被使用。解决问题就是需要配置静态资源不进行拦截，在springmvc.xml配置文件添加如下配置
        1. mvc:resources标签配置不过滤
        1. location元素表示webapp目录下的包下的所有文件
        2. mapping元素表示以/static开头的所有请求路径，如/static/a 或者/static/a/b

        &lt;!-- 设置静态资源不过滤 --&gt;
        &lt;mvc:resources location=&quot;/css/&quot; mapping=&quot;/css/**&quot;/&gt;  &lt;!-- 样式 --&gt;
        &lt;mvc:resources location=&quot;/images/&quot; mapping=&quot;/images/**&quot;/&gt;  &lt;!-- 图片 --&gt;
        &lt;mvc:resources location=&quot;/js/&quot; mapping=&quot;/js/**&quot;/&gt;  &lt;!-- javascript --&gt;</code></pre><p> json字符串和JavaBean对象互相转换的过程中，需要使用jackson的jar包</p>
<pre><code>
    &lt;dependency&gt;
            &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
            &lt;artifactId&gt;jackson-databind&lt;/artifactId&gt;
            &lt;version&gt;2.9.0&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
            &lt;artifactId&gt;jackson-core&lt;/artifactId&gt;
            &lt;version&gt;2.9.0&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
            &lt;artifactId&gt;jackson-annotations&lt;/artifactId&gt;
            &lt;version&gt;2.9.0&lt;/version&gt;
        &lt;/dependency&gt;</code></pre><h3 id="常用的注解"><a href="#常用的注解" class="headerlink" title="常用的注解"></a>常用的注解</h3><pre><code>0. RequestParam注解
        1. 作用：把请求中的指定名称的参数传递给控制器中的形参赋值
        2. 属性
        1. value：请求参数中的名称
        2. required：请求参数中是否必须提供此参数，默认值是true，必须提供

1. RequestBody注解
        1. 作用：用于获取请求体的内容（注意：get方法不可以）        
        2. 属性
            1. required：是否必须有请求体，默认值是true

2. PathVariable注解
        1. 作用：拥有绑定url中的占位符的。例如：url中有/delete/{id}，{id}就是占位符
        2. 属性
        3. value：指定url中的占位符名称
3. Restful风格的URL
        1. 请求路径一样，可以根据不同的请求方式去执行后台的不同方法
        2. restful风格的URL优点
                1. 结构清晰
                2. 符合标准
                3. 易于理解
                4. 扩展方便
                5. 代码如下

                    /**
                     * 接收请求
                     * @return
                     */
                    @RequestMapping(path=&quot;/hello&quot;)
                    public String sayHello(@RequestParam(value=&quot;username&quot;,required=false)String name) {
                        System.out.println(&quot;aaaa&quot;);
                        System.out.println(name);
                        return &quot;success&quot;;
                    }

4. RequestHeader注解
        1. 作用：获取指定请求头的值
        2. 属性
            1. value：请求头的名称
            2. 代码如下



5. CookieValue注解
        1. 作用：用于获取指定cookie的名称的值
        2. 属性
            1. value：cookie的名称
            2. 代码
6. ModelAttribute注解
1. 作用
        1. 出现在方法上：表示当前方法会在控制器方法执行前先执行。
        2. 出现在参数上：获取指定的数据给参数赋值。
2. 应用场景
        1. 当提交表单数据不是完整的实体数据时，保证没有提交的字段使用数据库原来的数据。
        2. 具体的代码

    &lt;a href=&quot;user/hello/1&quot;&gt;入门案例&lt;/a&gt;

    /**
     * 接收请求
     * @return
     */
    @RequestMapping(path=&quot;/hello/{id}&quot;)
    public String sayHello(@PathVariable(value=&quot;id&quot;) String id) {
        System.out.println(id);
        return &quot;success&quot;;
    }   

 RequestHeader 

使用说明 

作用： 
 用于获取请求消息头。 
属性： 
 value：提供消息头名称 
 required：是否必须有此消息头 
注： 
 在实际开发中一般不怎么用。 
控制器中代码： 
public String useRequestHeader(@RequestHeader(value=&quot;Accept-Language&quot;, required=false)String requestHeader){} </code></pre><h2 id="SpringMVC实现文件上传"><a href="#SpringMVC实现文件上传" class="headerlink" title="SpringMVC实现文件上传"></a>SpringMVC实现文件上传</h2><pre><code>
1. 导入文件上传的jar包

            &lt;dependency&gt;
                &lt;groupId&gt;commons-fileupload&lt;/groupId&gt;
                &lt;artifactId&gt;commons-fileupload&lt;/artifactId&gt;
                &lt;version&gt;1.3.1&lt;/version&gt;
            &lt;/dependency&gt;
            &lt;dependency&gt;
                &lt;groupId&gt;commons-io&lt;/groupId&gt;
                &lt;artifactId&gt;commons-io&lt;/artifactId&gt;
                &lt;version&gt;2.4&lt;/version&gt;
            &lt;/dependency&gt;


2. 编写文件上传的JSP页面
            &lt;h3&gt;文件上传&lt;/h3&gt;
            &lt;form action=&quot;user/fileupload&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;
                选择文件：&lt;input type=&quot;file&quot; name=&quot;upload&quot;/&gt;&lt;br/&gt;
                &lt;input type=&quot;submit&quot; value=&quot;上传文件&quot;/&gt;
            &lt;/form&gt;
 3. 编写文件上传的Controller控制器
            /**
             * 文件上传
             * @throws Exception 
             */
            @RequestMapping(value=&quot;/fileupload&quot;)
            public String fileupload(HttpServletRequest request) throws Exception {
                // 先获取到要上传的文件目录
                String path = request.getSession().getServletContext().getRealPath(&quot;/uploads&quot;);
                // 创建File对象，一会向该路径下上传文件
                File file = new File(path);
                // 判断路径是否存在，如果不存在，创建该路径
                if(!file.exists()) {
                    file.mkdirs();
                }
                // 创建磁盘文件项工厂
                DiskFileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload fileUpload = new ServletFileUpload(factory);
                // 解析request对象
                List&lt;FileItem&gt; list = fileUpload.parseRequest(request);
                // 遍历
                for (FileItem fileItem : list) {
                    // 判断文件项是普通字段，还是上传的文件
                    if(fileItem.isFormField()) {

                    }else {
                        // 上传文件项
                    // 获取到上传文件的名称
                    String filename = fileItem.getName();
                    // 上传文件
                    fileItem.write(new File(file, filename));
                    // 删除临时文件
                    fileItem.delete();
                }
            }

            return &quot;success&quot;;
        }
</code></pre><h3 id="SpringMVC框架中的拦截器"><a href="#SpringMVC框架中的拦截器" class="headerlink" title="SpringMVC框架中的拦截器"></a>SpringMVC框架中的拦截器</h3><pre><code>
1. 拦截器的概述 
    1. SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。
    2. 可以定义拦截器链，连接器链就是将拦截器按着一定的顺序结成一条链，在访问被拦截的方法时，拦截器链
    中的拦截器会按着定义的顺序执行。
3. 拦截器和过滤器的功能比较类似，有区别
    1. 过滤器是Servlet规范的一部分，任何框架都可以使用过滤器技术。
    2. 拦截器是SpringMVC框架独有的。
    3. 过滤器配置了/*，可以拦截任何资源。
    4. 拦截器只会对控制器中的方法进行拦截。
4. 拦截器也是AOP思想的一种实现方式
    5. 想要自定义拦截器，需要实现HandlerInterceptor接口。
    2. 自定义拦截器步骤 
    1. 创建类，实现HandlerInterceptor接口，重写需要的方法

 package cn.itcast.demo1;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;

/**
 * 自定义拦截器1
 * @author rt
 */
public class MyInterceptor1 implements HandlerInterceptor{

    /**
     * controller方法执行前，进行拦截的方法
     * return true放行
     * return false拦截
     * 可以使用转发或者重定向直接跳转到指定的页面。
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
Object handler)
            throws Exception {
        System.out.println(&quot;拦截器执行了...&quot;);
        return true;
    }

}


    &lt;!-- 配置拦截器 --&gt;
    &lt;mvc:interceptors&gt;
        &lt;mvc:interceptor&gt;
            &lt;!-- 哪些方法进行拦截 --&gt;
            &lt;mvc:mapping path=&quot;/user/*&quot;/&gt;
            &lt;!-- 哪些方法不进行拦截 
            &lt;mvc:exclude-mapping path=&quot;&quot;/&gt;
            --&gt;
            &lt;!-- 注册拦截器对象 --&gt;
            &lt;bean class=&quot;cn.itcast.demo1.MyInterceptor1&quot;/&gt;
        &lt;/mvc:interceptor&gt;
    &lt;/mvc:interceptors&gt;</code></pre><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><h3 id="1-配置核心容器"><a href="#1-配置核心容器" class="headerlink" title="1.配置核心容器"></a>1.配置核心容器</h3><pre><code class="xml">    &lt;!-- 配置前端控制器：服务器启动必须加载，需要加载springmvc.xml配置文件 --&gt;
           &lt;servlet&gt;
               &lt;servlet-name&gt;dispatcherServlet&lt;/servlet-name&gt;
               &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt;
               &lt;!-- 配置初始化参数，创建完DispatcherServlet对象，加载springmvc.xml配置文件 --&gt;
               &lt;init-param&gt;
                   &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
                   &lt;param-value&gt;classpath:springmvc.xml&lt;/param-value&gt;
               &lt;/init-param&gt;
               &lt;!-- 服务器启动的时候，让DispatcherServlet对象创建 --&gt;
               &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
           &lt;/servlet&gt;
           &lt;servlet-mapping&gt;
               &lt;servlet-name&gt;dispatcherServlet&lt;/servlet-name&gt;
               &lt;url-pattern&gt;/&lt;/url-pattern&gt;
           &lt;/servlet-mapping&gt;

    &lt;!-- 在web.xml中配置DispatcherServlet过滤器解决中文乱码 --&gt;

   ​        &lt;!-- 配置解决中文乱码的过滤器 --&gt;
   ​        &lt;filter&gt;
   ​            &lt;filter-name&gt;characterEncodingFilter&lt;/filter-name&gt;
   ​            &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;
   ​            &lt;init-param&gt;
   ​                &lt;param-name&gt;encoding&lt;/param-name&gt;
   ​                &lt;param-value&gt;UTF-8&lt;/param-value&gt;
   ​            &lt;/init-param&gt;
   ​        &lt;/filter&gt;
   ​        &lt;filter-mapping&gt;
   ​            &lt;filter-name&gt;characterEncodingFilter&lt;/filter-name&gt;
   ​            &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
   ​        &lt;/filter-mapping&gt;</code></pre>
<p>​    </p>
<h3 id="2-配置springmvc-xml"><a href="#2-配置springmvc-xml" class="headerlink" title="2.配置springmvc.xml"></a>2.配置springmvc.xml</h3><p> 创建springmvc.xml的配置文件，编写配置文件</p>
<pre><code class="xml">   &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
       &lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
           xmlns:mvc=&quot;http://www.springframework.org/schema/mvc&quot; 
       xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
           xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
           xsi:schemaLocation=&quot;
               http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans.xsd
               http://www.springframework.org/schema/mvc
               http://www.springframework.org/schema/mvc/spring-mvc.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context.xsd&quot;&gt;
           &lt;!-- 扫描controller的注解，别的不扫描 --&gt;
           &lt;context:component-scan base-package=&quot;cn.itcast&quot;&gt;
               &lt;context:include-filter type=&quot;annotation&quot; 
       expression=&quot;org.springframework.stereotype.Controller&quot;/&gt;
           &lt;/context:component-scan&gt;
           &lt;!-- 配置视图解析器 --&gt;
           &lt;bean id=&quot;viewResolver&quot; class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
               &lt;!-- JSP文件所在的目录 --&gt;
               &lt;property name=&quot;prefix&quot; value=&quot;/WEB-INF/pages/&quot; /&gt;
               &lt;!-- 文件的后缀名 --&gt;
               &lt;property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
           &lt;/bean&gt;
           &lt;!-- 设置静态资源不过滤 --&gt;
           &lt;mvc:resources location=&quot;/css/&quot; mapping=&quot;/css/**&quot; /&gt;
           &lt;mvc:resources location=&quot;/images/&quot; mapping=&quot;/images/**&quot; /&gt;
           &lt;mvc:resources location=&quot;/js/&quot; mapping=&quot;/js/**&quot; /&gt;
           &lt;!-- 开启对SpringMVC注解的支持 --&gt;
           &lt;mvc:annotation-driven /&gt;
       &lt;/beans&gt;</code></pre>
<h2 id="3-测试SpringMVC的框架搭建是否成功"><a href="#3-测试SpringMVC的框架搭建是否成功" class="headerlink" title="3.测试SpringMVC的框架搭建是否成功"></a>3.测试SpringMVC的框架搭建是否成功</h2><pre><code>1. 测试SpringMVC的框架搭建是否成功

   1. 编写index.jsp和list.jsp编写，超链接   
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;

   @Controller
   @RequestMapping(&quot;/account&quot;)
   public class AccountController {

       /**
        * 查询所有的数据
        * @return
        */
       @RequestMapping(&quot;/findAll&quot;)
       public String findAll() {
           System.out.println(&quot;表现层：查询所有账户...&quot;);
           return &quot;list&quot;;
       }

   }

2. 目的: 在controller中能成功的调用service对象中的方法。

3. 在项目启动的时候，就去加载applicationContext.xml的配置文件，在web.xml中配置ContextLoaderListener监听器（该监听器只能加载WEB-INF目录下的applicationContext.xml的配置文
   件）。
        &lt;!-- 配置Spring的监听器 --&gt;
            &lt;listener&gt;
                &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-
        class&gt;
            &lt;/listener&gt;
            &lt;!-- 配置加载类路径的配置文件 --&gt;
            &lt;context-param&gt;
                &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
                &lt;param-value&gt;classpath:applicationContext.xml&lt;/param-value&gt;
            &lt;/context-param&gt;

4. 在controller中注入service对象，调用service对象的方法进行测试

       import org.springframework.beans.factory.annotation.Autowired;
       import org.springframework.stereotype.Controller;
       import org.springframework.web.bind.annotation.RequestMapping;


        @Controller
        @RequestMapping(&quot;/account&quot;)
        public class AccountController {

            @Autowired
            private AccountService accoutService;

            /**
             * 查询所有的数据
             * @return
             */
            @RequestMapping(&quot;/findAll&quot;)
            public String findAll() {
                System.out.println(&quot;表现层：查询所有账户...&quot;);
                accoutService.findAll();
                return &quot;list&quot;;
            }

        }

</code></pre>
        </div>
        <!-- .entry-content -->
        
        <p></p>
          
        <div style="text-align:center; width: 100%" class="social-share share-mobile" data-disabled="diandian, tencent"></div>
        <footer class="post-footer">
          <div class="post-lincenses"><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" target="_blank" rel="nofollow"><i class="fa fa-creative-commons" aria-hidden="true"></i> 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a></div>
          <div class="post-tags">
            <div class="tag-cloud">
              <div class="tag-cloud-title">
              </div>
              <div class="tag-cloud-tags">
              <a href="/tags/CDN/" style="font-size: 10px; color: #f38181">CDN</a> <a href="/tags/Chrome/" style="font-size: 10px; color: #f38181">Chrome</a> <a href="/tags/Collection/" style="font-size: 10px; color: #f38181">Collection</a> <a href="/tags/ElasticSearch/" style="font-size: 10px; color: #f38181">ElasticSearch</a> <a href="/tags/IO%E6%B5%81/" style="font-size: 10px; color: #f38181">IO流</a> <a href="/tags/JVM/" style="font-size: 10px; color: #f38181">JVM</a> <a href="/tags/Java/" style="font-size: 16.67px; color: #b4c1b8">Java</a> <a href="/tags/Linux/" style="font-size: 10px; color: #f38181">Linux</a> <a href="/tags/MySQL/" style="font-size: 10px; color: #f38181">MySQL</a> <a href="/tags/OIS/" style="font-size: 10px; color: #f38181">OIS</a> <a href="/tags/Redis/" style="font-size: 13.33px; color: #d4a19c">Redis</a> <a href="/tags/SQL/" style="font-size: 10px; color: #f38181">SQL</a> <a href="/tags/Springboot/" style="font-size: 10px; color: #f38181">Springboot</a> <a href="/tags/TCP-IP/" style="font-size: 10px; color: #f38181">TCP/IP</a> <a href="/tags/Tomcat/" style="font-size: 10px; color: #f38181">Tomcat</a> <a href="/tags/aop/" style="font-size: 10px; color: #f38181">aop</a> <a href="/tags/bili/" style="font-size: 10px; color: #f38181">bili</a> <a href="/tags/eclipse/" style="font-size: 10px; color: #f38181">eclipse</a> <a href="/tags/git/" style="font-size: 10px; color: #f38181">git</a> <a href="/tags/github/" style="font-size: 13.33px; color: #d4a19c">github</a> <a href="/tags/ioc/" style="font-size: 10px; color: #f38181">ioc</a> <a href="/tags/java/" style="font-size: 20px; color: #95e1d3">java</a> <a href="/tags/jsdelivr/" style="font-size: 10px; color: #f38181">jsdelivr</a> <a href="/tags/oracle/" style="font-size: 10px; color: #f38181">oracle</a> <a href="/tags/spring/" style="font-size: 13.33px; color: #d4a19c">spring</a> <a href="/tags/sring/" style="font-size: 10px; color: #f38181">sring</a> <a href="/tags/vscode/" style="font-size: 10px; color: #f38181">vscode</a> <a href="/tags/web/" style="font-size: 10px; color: #f38181">web</a> <a href="/tags/%E5%8F%8D%E5%B0%84/" style="font-size: 10px; color: #f38181">反射</a> <a href="/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/" style="font-size: 10px; color: #f38181">多线程</a> <a href="/tags/%E5%AE%9E%E4%B9%A0/" style="font-size: 10px; color: #f38181">实习</a> <a href="/tags/%E6%8E%92%E5%BA%8F/" style="font-size: 10px; color: #f38181">排序</a> <a href="/tags/%E6%B3%A8%E8%A7%A3/" style="font-size: 10px; color: #f38181">注解</a> <a href="/tags/%E6%B4%BE%E5%A4%A7%E6%98%9F/" style="font-size: 10px; color: #f38181">派大星</a> <a href="/tags/%E7%BD%91%E7%BB%9C/" style="font-size: 10px; color: #f38181">网络</a>
              </div>
            </div>
          </div>
          <div class="post-share">
            <div class="social-share sharehidden share-component"></div>
            <i class="iconfont show-share icon-forward"></i>
          </div>
        </footer><!-- .entry-footer -->
      </article>
      <!-- #post-## -->
      <div class="toc" style="background: none;"></div>
      <section class="post-squares nextprev">
        
          
            <div class="post-nepre half previous">
          
            <a href="/posts/d1a103b7.html" rel="prev">
              <div class="background">
<!--                <img class="lazyload" src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/upload.gif" data-src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/banner/wallhaven-j3vxyy.jpg" style="width: 100%; height: 100%; object-fit: cover; pointer-events: none;" onerror="imgError(this,3)" src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/banner/wallhaven-j3vxyy.jpg">-->
                
                <img class="lazyload" src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/upload.gif" data-src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/banner/wallhaven-j3vxyy.jpg" style="width: 100%; height: 100%; object-fit: cover; pointer-events: none;" onerror="imgError(this,3)" >
              </div>
              <span class="label">
              Previous Post</span>
              <div class="info">
                <h3>
                对Spring的一些理解</h3>
                <hr>
              </div>
            </a>
          </div>
        
        
          
            <div class="post-nepre half next">
          
            <a href="/posts/6a343b7f.html" rel="next">
              <div class="background">
                
                <img class="lazyload" src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/upload.gif" data-src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/banner/wallhaven-q2lm9l.jpg" style="width: 100%; height: 100%; object-fit: cover; pointer-events: none;" onerror="imgError(this,3)" >
              </div>
              <span class="label">
              Next Post</span>
              <div class="info">
                <h3>
                Redis入门</h3>
                <hr>
              </div>
            </a>
          </div>
        
      </section>
      
      <section class="author-profile">
        <div class="info" itemprop="author" itemscope="" itemtype="https://schema.org/Person">
          <a href="" class="profile gravatar"><img src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/xiaomai.jpg" itemprop="image" alt="Conor_hua" height="70" width="70"></a>
          <div class="meta">
            <span class="title">Author</span>
            <h3 itemprop="name">
            <a href="" itemprop="url" rel="author">Conor_hua</a>
            </h3>
          </div>
        </div>
        <hr>
        <p><i class="iconfont icon-write"></i></p>
      </section>
    </main><!-- #main -->
  </div><!-- #primary -->
</div>


    </div>    
    <div class="ins-search">
    <div class="ins-search-mask"></div>
    <div class="ins-search-container">
        <div class="ins-input-wrapper">
            <input type="text" class="ins-search-input" placeholder="请输入关键词..."/>
            <span class="ins-close ins-selectable"><i class="fa fa-times-circle"></i></span>
        </div>
        <div class="ins-section-wrapper">
            <div class="ins-section-container"></div>
        </div>
    </div>
</div>
<script>
(function (window) {
    var INSIGHT_CONFIG = {
        TRANSLATION: {
            POSTS: '文章',
            // PAGES: '页面',
            CATEGORIES: '分类',
            TAGS: '标签',
        },
        ROOT_URL: '/',
        CONTENT_URL: '/content.json',
    };
    window.INSIGHT_CONFIG = INSIGHT_CONFIG;
})(window);
</script>
    <!-- <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2021 Conor_hua<br>
      powered_by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer> -->
<footer id="colophon" class="site-footer" role="contentinfo">
    <div class="site-info">
        <div class="footertext">
            <div class="img-preload">
                <img src="https://cdn.jsdelivr.net/gh/honjun/cdn@1.6/img/other/wordpress-rotating-ball-o.svg">
                <img src="https://cdn.jsdelivr.net/gh/honjun/cdn@1.6/img/other/disqus-preloader.svg">
            </div>
            
            <p>本站总访问量：<a id="allcount"></a></p>
            <p style="color: #666666;">it you can dream it you can do it</p>
            
                <p id="momk" style="font-family: 'Ubuntu', sans-serif;color: #b9b9b9;"></p>
            
        </div>
        <div class="footer-device">
            <p style="font-family: 'Ubuntu', sans-serif;">
 <span style=""> <a 
                         style="color: 	#FF69B4;;text-decoration: underline dotted rgba(0, 0, 0, .1);">Conor_hua</a> <i
             class="iconfont icon-sakura rotating" style="color: #ffc0cb;display:inline-block"></i> Theme <a
             href="https://github.com/xbclub/Hexo-theme-sakura" target="_blank"
             style="color: #FF69B4;;text-decoration: underline dotted rgba(0, 0, 0, .1);">Sakura</a><a
             
             style="color: #b9b9b9;;text-decoration: underline dotted rgba(0, 0, 0, .1);">, Powered by</a><a
             href="https://github.com/hexojs/hexo" target="_blank"
             style="color: #FF69B4;;text-decoration: underline dotted rgba(0, 0, 0, .1);"> Hexo</a>
        </span>
            </p>
        </div>
    </div><!-- .site-info -->
    <!--壁纸切换-->
  <div class="skin-menu no-select" id="mainskin"  style="position: fixed">
    <div class="theme-controls row-container">
        <ul class="menu-list">
            <li id="white-bg"> <i class="fa fa-television" aria-hidden="true"></i></li>
            <li id="sakura-bg"> <i class="iconfont icon-sakura"></i></li>
            <li id="gribs-bg"> <i class="fa fa-slack" aria-hidden="true"></i></li>
            <li id="KAdots-bg"> <i class="iconfont icon-dots"></i></li>
            <li id="totem-bg"> <i class="fa fa-optin-monster" aria-hidden="true"></i></li>
            <li id="pixiv-bg"> <i class="iconfont icon-pixiv"></i></li>
            <li id="bing-bg"> <i class="iconfont icon-bing"></i></li>
            <li id="dark-bg"> <i class="fa fa-moon-o" aria-hidden="true"></i></li>
        </ul>
    </div>
    <div class="font-family-controls row-container">
        <button type="button" class="control-btn-serif selected" data-mode="serif" onclick="mashiro_global.font_control.change_font()">Serif</button>
        <button type="button" class="control-btn-sans-serif" data-mode="sans-serif" onclick="mashiro_global.font_control.change_font()">Sans Serif</button>
    </div>
</div>   
<canvas id="night-mode-cover"></canvas> 
  <div class="changeSkin-gear no-select">
    <div class="keys" id="setbtn"> <span id="open-skinMenu"> 切换壁纸 | SCHEME TOOL 
      &nbsp;<i class="iconfont icon-gear inline-block rotating"></i> </span></div>
</div><!--skin.end-->
</footer>


<!--<script src="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.7/js/tocbot.min.js"></script>-->

<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.8/js/lib.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/clipboard@2/dist/clipboard.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.8/js/InsightSearch.js"></script>
<script type="text/javascript"
        src="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.8/js/jquery.fancybox.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.8/js/zoom.min.js"></script>

<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@1.2/js/sakura-app.js"></script>
    
<script src="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.8/js/av-min.js"></script>
<script src='https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.8/js/Valine.min.js'></script>
<script src="https://cdn.jsdelivr.net/gh/xbclub/staticCDN@0.8/js/botui.js"></script>
<!-- 不蒜子 网页计数器 -->

      
       <script>
  fetch('https://counts.42cloud.cn/api/counts.html')
        .then(response => response.json())
        .then(data => {
              if (document.getElementById("readcount")) {
                document.getElementById("readcount").innerHTML=data.Count;
            }
            if (document.getElementById("allcount")){
                document.getElementById("allcount").innerHTML=data.Allcount;
            }
        })
        .catch(err => console.error(err))
</script>
      
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.4.2/tocbot.min.js"></script> -->
<script type="text/javascript">
    /* <![CDATA[ */
    if (/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) {
        var Poi = {
            "pjax": "1",
            "movies": {"url": "https://cdn.jsdelivr.net/gh/honjun/hojun@1.2", "name": "Unbroken.mp4", "live": "close"},
            "windowheight": "fixed",
            "codelamp": "close",
            "ajaxurl": "",
            "order": "asc",
            "formpostion": "bottom"
        };
    } else {
        var Poi = {
            "pjax": "1",
            "movies": {"url": "https://cdn.jsdelivr.net/gh/honjun/hojun@1.2", "name": "Unbroken.mp4", "live": "open"},
            "windowheight": "auto",
            "codelamp": "close",
            "ajaxurl": "",
            "order": "asc",
            "formpostion": "bottom"
        };
    }
    /* ]]> */

</script>
<script>
    $(document).ready(function () {
        if ($(".toc").length > 0 && document.body.clientWidth > 1200) {
            if ($(".pattern-center").length > 0) { //有图的情况
                tocbot.init({
                    // Where to render the table of contents.
                    tocSelector: '.toc', // 放置目录的容器
                    // Where to grab the headings to build the table of contents.
                    contentSelector: '.entry-content', // 正文内容所在
                    // Which headings to grab inside of the contentSelector element.
                    scrollSmooth: true,
                    headingSelector: 'h1, h2, h3, h4, h5', // 需要索引的标题级别
                    headingsOffset: -400,
                    scrollSmoothOffset: -85
                });
            } else {
                tocbot.init({
                    // Where to render the table of contents.
                    tocSelector: '.toc', // 放置目录的容器
                    // Where to grab the headings to build the table of contents.
                    contentSelector: '.entry-content', // 正文内容所在
                    // Which headings to grab inside of the contentSelector element.
                    scrollSmooth: true,
                    headingSelector: 'h1, h2, h3, h4, h5', // 需要索引的标题级别
                    headingsOffset: -85,
                    scrollSmoothOffset: -85
                });
            }
            var offsetTop = $('.toc').offset().top - 95;
            window.onscroll = function () {
                var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
                if (scrollTop >= offsetTop) {
                    $('.toc').addClass('toc-fixed');
                } else {
                    $('.toc').removeClass('toc-fixed');
                }
            }
        }
    });

</script>
<span style="color: #FF69B4 ;padding-left: 20px;">
    <i class="fa fa-clock-o" aria-hidden="true"></i>
    <span id="time" align="center">载入时间中...</span>

    <script type="text/javascript">
        function NewDate(str) {
            str = str.split('-');
            var date = new Date();
            date.setUTCFullYear(str[0], str[1] - 1, str[2]);
            date.setUTCHours(0, 0, 0, 0);
            return date;
        }

        function momxc() {
            var birthDay = NewDate("2020-7-16");
            var today = new Date();
            var timeold = today.getTime() - birthDay.getTime();
            var sectimeold = timeold / 1000
            var secondsold = Math.floor(sectimeold);
            var msPerDay = 24 * 60 * 60 * 1000;
            var e_daysold = timeold / msPerDay;
            var daysold = Math.floor(e_daysold);
            var e_hrsold = (daysold - e_daysold) * -24;
            var hrsold = Math.floor(e_hrsold);
            var e_minsold = (hrsold - e_hrsold) * -60;
            var minsold = Math.floor((hrsold - e_hrsold) * -60);
            var seconds = Math.floor((minsold - e_minsold) * -60).toString();
            document.getElementById("momk").innerHTML = "本小破站已勉强维持生活" + daysold + "天" + hrsold + "小时" + minsold + "分" + seconds + "秒";
            setTimeout(momxc, 1000);
        }
        
        momxc();
    </script>


</span>


    <div class="openNav no-select" style="height: 50px;">
      <div class="iconflat no-select" style="width: 50px; height: 50px;">
        <div class="icon"></div>
      </div>
      <div class="site-branding search-form-submit">
        <i class="iconfont js-toggle-search iconsearch icon-search"></i>
      </div>
    </div>
  </section>
  <div id="mo-nav" class="">
  <div class="m-avatar">
    <img src="https://cdn.jsdelivr.net/gh/conorhua/asset/ima/xiaomai.jpg">
  </div>
  <p style="text-align: center; color: #333; font-weight: 900; font-family: 'Ubuntu', sans-serif; letter-spacing: 1.5px">Conor_hua</p>
  <p style="text-align: center; word-spacing: 20px;">
    
  </p>
  <ul id="menu-new-1" class="menu">
    
      <li>
        <a href="/">
          <span class="faa-parent animated-hover">
            <i class="fa  fa-fort-awesome faa-shake" aria-hidden="true"></i>
            首页
          </span>
        </a>
        
      </li>
    
      <li>
        <a href="/archives">
          <span class="faa-parent animated-hover">
            <i class="fa  fa-archive faa-shake" aria-hidden="true"></i>
            归档
          </span>
        </a>
        
          <ul class="sub-menu">
            
              <li>
                <a href="/categories/%E6%8A%80%E6%9C%AF/">
                  <i class="fa fa-code" aria-hidden="true"></i>
                  技术
                </a>
              </li>
            
              <li>
                <a href="/categories/%E5%B9%B2%E8%B4%A7/">
                  <i class="fa fa-plug" aria-hidden="true"></i>
                  干货
                </a>
              </li>
            
          </ul>
        
      </li>
    
      <li>
        <a href="javascript:;">
          <span class="faa-parent animated-hover">
            <i class="fa  fa-list-ul faa-vertical" aria-hidden="true"></i>
            清单
          </span>
        </a>
        
          <ul class="sub-menu">
            
              <li>
                <a href="/bangumis/">
                  <i class="fa fa-film faa-vertical" aria-hidden="true"></i>
                  番剧
                </a>
              </li>
            
              <li>
                <a href="/categories/%E6%94%B6%E8%97%8F/">
                  <i class="fa fa-star" aria-hidden="true"></i>
                  收藏
                </a>
              </li>
            
          </ul>
        
      </li>
    
      <li>
        <a href="/tags/">
          <span class="faa-parent animated-hover">
            <i class="fa  fa-tags" aria-hidden="true"></i>
            标签
          </span>
        </a>
        
      </li>
    
      <li>
        <a href="javascript:;">
          <span class="faa-parent animated-hover">
            <i class="fa  fa-leaf faa-wrench" aria-hidden="true"></i>
            关于
          </span>
        </a>
        
          <ul class="sub-menu">
            
              <li>
                <a href="/about/">
                  <i class="fa fa-meetup" aria-hidden="true"></i>
                  我？
                </a>
              </li>
            
              <li>
                <a href="/theme-sakura/">
                  <i class="fa iconfont icon-sakura" aria-hidden="true"></i>
                  主题
                </a>
              </li>
            
          </ul>
        
      </li>
    
      <li>
        <a href="/links/">
          <span class="faa-parent animated-hover">
            <i class="fa  fa-link faa-shake" aria-hidden="true"></i>
            友人帐
          </span>
        </a>
        
      </li>
    
  </ul>
  <p style="text-align: center; font-size: 13px; color: #b9b9b9;">&copy 2019 hexo-sakura</p>
</div>
<button onclick="topFunction()" class="mobile-cd-top" id="moblieGoTop" title="Go to top" style="display: none;"><i class="fa fa-chevron-up" aria-hidden="true"></i></button>
  
</body>
<script src="https://cdn.jsdelivr.net/gh/conorhua/asset/js/noSomeKey.js"></script>
</html>